package com.linln.admin.app.service;

import com.linln.admin.app.domain.AppInfo;
import com.linln.admin.app.domain.AppVersion;
import com.linln.common.enums.StatusEnum;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @author 陶富成
 * @date 2021/07/09
 */
public interface VersionService {

    /**
     * 获取分页列表数据
     *
     * @param example 查询实例
     * @return 返回分页数据
     */
    Page<AppVersion> getPageList(Example<AppVersion> example);

    /**
     * 根据ID查询数据
     *
     * @param id 主键ID
     */
    AppVersion getById(Long id);

    /**
     * 保存数据
     *
     * @param appVersion 实体对象
     * @param memberIds  需求参与人员
     */
    AppVersion save(AppVersion appVersion, String[] memberIds);

    /**
     * 状态(启用，冻结，删除)/批量状态处理
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean updateStatus(StatusEnum statusEnum, List<Long> idList);

    /**
     * 创建一个release分支，然后将dev分支合并到release分支上，如果现在的开发分支有合并冲突，不允许创建
     *
     * @param versionId
     * @return
     */
    Long createReleaseBranch(long versionId);

    /**
     * 将指定版本中的所有发布分支的代码都检测一遍，检查发布分支代码规范：pom文件中是否有snapshot引用、pom文件中版本号改变规则等
     *
     * @param versionId
     * @return
     */
    Long branchPmdCheck(long versionId);

    /**
     * 将版本置为已发布状态。要做的事情：将release代码合并到prod，合并成功后，将prod代码合并到当前所有在开发的版本中
     *
     * @param versionId
     * @return
     */
    Long doPublished(long versionId);

    boolean hasDevBranch(Long versionId);

    /**
     * 是否存在合并代码冲突
     *
     * @param versoinId
     * @return
     */
    boolean hasConflict(Long versoinId);

    /**
     * 检查并行开发的应用信息，即：列出各个并行开发的应用及所在对应的版本信息
     *
     * @return
     */
    Map<AppInfo, List<AppVersion>> combineAppCurrencyInfo();

    /**
     * 判断发布后的项目能不能再重新打开。逻辑：看最后一次的发布记录中是不是当前项目。
     *
     * @param versionId
     * @return
     */
    boolean canReopen(Long versionId);

    void reopen(long versionId);

    boolean discard(List<Long> ids);

    /**
     * 获取所有还未上线的所有版本
     *
     * @return
     */
    List<AppVersion> getAllDevVersions();

    String combinePublishProfiles(Long versionId, String env, String profile);

    List<Long> getUserIdsByVersionId(Long versionId);

    String getProductionTitles(Long versionId);
}